const express = require('express');
const bodyParser = require('body-parser');
const cors = require('cors');
const dotenv = require('dotenv');

// 根据环境加载不同的.env文件
const envFile = process.env.NODE_ENV === 'production' ? '.env.production' : '.env';
dotenv.config({ path: envFile });

// 导入数据库配置和模型
const { sequelize, syncDatabase } = require('./models');

// 导入路由
const userRoutes = require('./routes/userRoutes');
const accountRoutes = require('./routes/accountRoutes');
const categoryRoutes = require('./routes/categoryRoutes');

// 创建Express应用
const app = express();
const path = require('path');

// 中间件设置
app.use(cors());
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));

// 设置静态文件服务
app.use(express.static(path.join(__dirname, '../frontend')));

// 健康检查路由
app.get('/health', (req, res) => {
  res.status(200).json({
    success: true,
    message: '服务运行正常',
    timestamp: new Date().toISOString()
  });
});

// API路由设置
app.use('/api/users', userRoutes);
app.use('/api/accounts', accountRoutes);
app.use('/api/categories', categoryRoutes);

// 错误处理中间件
app.use((err, req, res, next) => {
  console.error('未捕获的错误:', err);
  res.status(500).json({
    success: false,
    message: '服务器内部错误',
    error: process.env.NODE_ENV === 'production' ? null : err.message
  });
});

// 404处理 - 对于非API请求，返回index.html（支持单页应用路由）
app.use((req, res) => {
  // 如果是API请求，返回404 JSON响应
  if (req.url.startsWith('/api')) {
    res.status(404).json({
      success: false,
      message: '请求的资源不存在'
    });
  } else {
    // 对于非API请求，返回index.html
    res.sendFile(path.join(__dirname, '../frontend', 'index.html'));
  }
});

// 启动服务器
const PORT = process.env.PORT || 3000;

async function startServer() {
  try {
    // 启动服务器
    app.listen(PORT, () => {
      console.log(`服务器运行在 http://localhost:${PORT}`);
      console.log(`API文档地址: http://localhost:${PORT}/api`);
    });
    
    // 异步同步数据库（允许服务器在数据库暂时不可用时仍能启动）
    try {
      await syncDatabase();
      console.log('数据库同步成功');
    } catch (dbError) {
      console.warn('⚠️  数据库同步失败，部分功能可能不可用:', dbError.message);
      console.warn('请确保MySQL服务正在运行，并且.env文件中的配置正确');
    }
  } catch (error) {
    console.error('启动服务器失败:', error);
    process.exit(1);
  }
}

// 启动服务器
startServer();